/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.model;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.db.SqlManager;
import com.exception.DataException;
import com.javabeans.Pais;
import com.javabeans.Ciudad;
/**
 * @author Administrador
 */
public class AdminCiudad implements CiudadManager{
    private Connection c;

    public AdminCiudad(Connection c){
        this.c = c;
    }
    
    public int getIdCiudad(int idPais) throws DataException {
        int res = 0;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT IFNULL(max(IDCIUDAD)+1,1) AS ID FROM CIUDAD WHERE IDPAIS="+idPais;
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            rs.next();
            res = rs.getInt("ID");
        }catch(SQLException e){
            throw new DataException(" AdminCiudad -> getIdCiudad() "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }
    
    public void saveCiudad(Ciudad ciu) throws DataException {
        PreparedStatement preSt = null;
        String query = "";
        try{
            query ="INSERT INTO CIUDAD VALUES("+ciu.getIdPais();
            query += ", "+ciu.getIdCiudad();
            query += ", '"+ciu.getNombre().toUpperCase().trim();
            query += "', '"+ciu.getSigla().toUpperCase().trim();
            query += "', "+ciu.isActivo()+")";            
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
            
        }catch(SQLException ex){
            throw new DataException("Error saveCiudad(Ciudad ciu) "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    public List<Ciudad> getCiudadesPorPaisBasic(int idPais) throws DataException{
        List<Ciudad> ciudades = new ArrayList<Ciudad>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT IDPAIS, IDCIUDAD, NOMBRE, SIGLA";
            query += " FROM CIUDAD";
            query += " WHERE IDPAIS = "+idPais+" AND ACTIVO=1";
            query += " ORDER BY NOMBRE";             
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Ciudad c = new Ciudad();
                c.setIdPais(rs.getInt("IDPAIS"));
                c.setIdCiudad(rs.getInt("IDCIUDAD"));
                c.setNombre(rs.getString("NOMBRE"));
                c.setSigla(rs.getString("SIGLA"));
                c.setActivo(true);
                ciudades.add(c);
            }
        }catch(SQLException e){
            throw new DataException(" -> getCiudadesPorPaisBasic(int idPais) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return ciudades;
    }
    
    public List<Ciudad> getCiudadesPorPaisInactivos(int idPais) throws DataException{
        List<Ciudad> ciudades = new ArrayList<Ciudad>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT IDPAIS, IDCIUDAD, NOMBRE, SIGLA";
            query += " FROM CIUDAD";
            query += " WHERE IDPAIS = "+idPais+" AND ACTIVO=0";
            query += " ORDER BY NOMBRE";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Ciudad c = new Ciudad();
                c.setIdPais(rs.getInt("IDPAIS"));
                c.setIdCiudad(rs.getInt("IDCIUDAD"));
                c.setNombre(rs.getString("NOMBRE"));
                c.setSigla(rs.getString("SIGLA"));
                c.setActivo(true);
                ciudades.add(c);
            }
        }catch(SQLException e){
            throw new DataException(" getCiudadesPorPaisInactivos(int idPais) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return ciudades;
    }
    
    public void updateCiudad(Ciudad ciu) throws DataException {
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE CIUDAD SET NOMBRE ='"+ciu.getNombre().toUpperCase();
            query+= "', SIGLA ='"+ciu.getSigla().toUpperCase();
            query+= "' WHERE IDPAIS = "+ciu.getIdPais()+" AND IDCIUDAD = "+ciu.getIdCiudad();            
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException("Error! en AdminCiudad -> updateCiudad(Ciudad ciu) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    public boolean isUseInDetalleEst(int idPais, int idCiudad) throws DataException{
        boolean res = false;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT IDDETALLE_ESTUDIANTE";
        query += " FROM DETALLE_ESTUDIANTE";
        query += " WHERE (IDPAIS_ACTUAL = "+idPais+" AND IDCIUDAD_ACTUAL="+idCiudad;
        query += ") OR (IDPAIS_NAC = "+idPais+" AND IDCIUDAD_ACTUAL="+idCiudad;
        query += ") LIMIT 1";
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            if(rs.next())
                res = true;
        }catch(SQLException e){
            throw new DataException(" AdminCiudad -> isUseInDetalleEst() "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }
    
    public void deleteCiudad(int idPais, int idCiudad) throws DataException {
        PreparedStatement preSt = null;
        String query = "DELETE FROM CIUDAD WHERE IDPAIS="+idPais+" AND IDCIUDAD="+idCiudad;
        try{
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
            query = "DELETE FROM PROVINCIA WHERE IDPAIS="+idPais+" AND IDCIUDAD="+idCiudad;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException e){
            throw new DataException("Error! en AdminCiudad -> deleteCiudad(int idPais, int idCiudad) e = "+e.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    public void darBaja(int idPais, int idCiudad) throws DataException{
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE CIUDAD SET ACTIVO = 0 WHERE IDPAIS="+idPais+" AND IDCIUDAD="+idCiudad;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();            
            query = "UPDATE PROVINCIA SET ACTIVO = 0 WHERE IDPAIS="+idPais+" AND IDCIUDAD="+idCiudad;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminCiudad -> darBaja(int idPais, int idCiudad) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    public void darAlta(int idPais, int idCiudad) throws DataException{
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE CIUDAD SET ACTIVO = 1 WHERE IDPAIS="+idPais+" AND IDCIUDAD="+idCiudad;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
            
            query = "UPDATE PROVINCIA SET ACTIVO = 1 WHERE IDPAIS="+idPais+" AND IDCIUDAD="+idCiudad;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminPais -> darAlta(int idPais, int idCiudad) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    public List<Ciudad> getCiudadesActivos() throws DataException {
        List<Ciudad> ciudades = new ArrayList<Ciudad>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT IDPAIS, IDCIUDAD, NOMBRE, SIGLA";
            query += " FROM CIUDAD";
            query += " WHERE ACTIVO=1";
            query += " ORDER BY NOMBRE";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Ciudad c = new Ciudad();
                c.setIdPais(rs.getInt("IDPAIS"));
                c.setIdCiudad(rs.getInt("IDCIUDAD"));
                c.setNombre(rs.getString("NOMBRE"));
                c.setSigla(rs.getString("SIGLA"));
                c.setActivo(true);
                ciudades.add(c);
            }
        }catch(SQLException e){
            throw new DataException("Error! AdminCiudad -> getCiudades() e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return ciudades;
    }
}
